package br.com.divulgaqui.client;

import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * Fabrica de EJB's retirando-o sdo contexto, facilitando o lookup em beans não auto-injetáveis pelo EJB na aplicação.
 * @author lauksas@gmail.com
 *
 */
public class EJBclientFactory {
	private static EJBclientFactory EJBclientFactoryInstance;
	private static final String JNDI_GLOBAL = "java:global";
	private static final String APPLICATION_CONTAINER = "divulgaquiEAR";
	private static final String EJB_CONTAINER = "divulgaquiservice";
	private static final String JNDI_SEPARATOR = "/";
	private static final String I_SEPARATOR = "!";
	protected EJBclientFactory(){
		
	}
	public static EJBclientFactory getInstance(){
		if (EJBclientFactoryInstance == null) {
			 return new EJBclientFactory();
		}
		else {
			return EJBclientFactoryInstance;
		}
	}
	
	/**
	 * Monta nome JNDI para qualquer classe/interface.
	 * @param Classe EJB
	 * @param Interface
	 * @return Nome JNDI da classe
	 */
	private static String getJndiGlobalName(Class<?> ejb, Class<?> i){
		
		if (ejb == null || i == null) {
			throw new IllegalArgumentException("Parametros não podem ser nulos");
		}
		StringBuilder jndiGlobalName = new StringBuilder();
		jndiGlobalName.append(JNDI_GLOBAL);
		jndiGlobalName.append(JNDI_SEPARATOR);
		jndiGlobalName.append(APPLICATION_CONTAINER);
		jndiGlobalName.append(JNDI_SEPARATOR);
		jndiGlobalName.append(EJB_CONTAINER);
		jndiGlobalName.append(JNDI_SEPARATOR);
		jndiGlobalName.append(ejb.getSimpleName());
		jndiGlobalName.append(I_SEPARATOR);
		jndiGlobalName.append(i.getName());
		return jndiGlobalName.toString();
		
	}
	
	/**
	 * Método realiza o look up no contexto EJB da classe/interface passada.
	 * @param Classe EJB
	 * @param Interface
	 * @return EJB através da interface solicitada
	 */
	public static Object getEjbFromContext(Class<?> ejb, Class<?> i){
		try {
			InitialContext ic = new InitialContext();
			String jndiName = getJndiGlobalName(ejb, i);
			return ic.lookup(jndiName);
		} catch (NamingException e) {
			return null;
		}
		
	}
}
